package cn.deschen.common.utils;

/**
 * @Author hanbin_chen
 * @Description 用于生成序列号、随机号、订单号等专用工具类
 * @DateTime 2021/6/1
 * @Version V1.0.0
 */
public class NoUtil {

    /**
     * 用于30位计算的累加的值
     */
    private static volatile int count = 1;

    /**
     * 用于覆盖默认的公共空构造
     */
    private NoUtil() {
    }

    /**
     * 获取30位的唯一数值
     * 测试结果：10000000 / 11268ms = 887.4689/ms
     * @return
     */
    public static synchronized String getNo() {
        // 14位
        StringBuilder sb = new StringBuilder(DateUtil.convertTimeToString(System.currentTimeMillis(), DateUtil.DATETIME_FORMATTER));
        long nano = System.nanoTime();
        // 最小单位0.1毫秒
        long nanoLong = (nano - ((nano / 1000000L) * 1000000L)) / 100L;
        // 4位
        sb.append(fill(nanoLong, 4));
        // 8位
        sb.append(getRandNumber(8));
        // 4 位
        String cou = fill((long)count, 4);
        sb.append(cou);
        count++;
        if (count >= 10000) {
            count = 1;
        }
        return sb.toString();
    }


    /**
     * 如果value为0，自动填补（字符串前面自动填充0）
     *
     * @param value 输入的值
     * @param fillCount 需要填补到最大的长度值
     * @return
     */
    public static String fillZero(Long value, int fillCount) {
        String valueStr = value.toString();
        int length = valueStr.length();
        StringBuilder sb = new StringBuilder();
        int size = (fillCount - length);
        for (int i = 0; i < size; i++) {
            sb.append("0");
        }
        sb.append(valueStr);
        return sb.toString();
    }

    /**
     * 填补到最大的长度值
     *
     * @param value 输入的值
     * @param fillCount 需要填补到最大的长度值
     * @return
     */
    public static String fill(Long value, int fillCount) {
        if (null == value || value < 0) {
            return fillZero(0L, fillCount);
        }
        String valueStr = value.toString();
        int length = valueStr.length();
        if (length == fillCount) {
            return valueStr;
        } else if (length > fillCount) {
            return valueStr.substring(0, fillCount);
        } else {
            StringBuilder sb = new StringBuilder();
            int size = fillCount - length;
            for (int i = 0; i < size; i++) {
                sb.append(getRandNumber(9));
            }
            sb.append(valueStr);
            return sb.toString();
        }
    }

    /**
     * 获取相应位数的随机数
     *
     * @param count 位数
     * @return
     */
    public static String getRandNumber(int count) {
        if (count <= 0) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < count; i++) {
            sb.append(RandomUtil.getRandom(0, 9));
        }
        return sb.toString();
    }
}
